'''
Created on 01/06/2013

@author: jean
'''
from pm.database import db
from sqlalchemy import or_

class HistorialRelacion(db.Model):
    '''
        clase que guarda un historial de las relaciones del sistema
        @param id_historial_relacion: el primary key de la tabla 
        @param id_relacion: identificador de la relacion entre items
        @param id_origen: identificador del item origen
        @param id_destino: identificador del item destino
        @param tipo: tipo de relacion(padre-hijo, antecesor-sucesor)
        @param activo: estado de la relacion activo e inactivo
        @param nombre_origen:   nombre del item origen
        @param nombre_destino: nombre del item destino 
    '''
    __tablename__ = 'historial_relacion'
    id_historial_relacion = db.Column(db.Integer, primary_key=True, nullable=False)
    id_relacion = db.Column(db.Integer, ForeignKey('relaciones.id_relacion'),nullable=False)
    id_origen = db.Column(db.Integer, ForeignKey('historial_item.id_historial_item'),nullable=False)
    id_destino = db.Column(db.Integer, ForeignKey('historial_item.id_historial_item'),nullable=False)
    tipo = db.Column(db.Integer, nullable=False)
    activo = db.Column(db.Boolean, nullable=False)
    nombre_origen = db.Column(db.String(50), nullable=False)
    nombre_destino =db.Column(db.String(50), nullable=False)
    
    

    def __init__(self, id_relacion,id_origen, id_destino,tipo, activo,nombre_origen,nombre_destino):
        '''
        Constructor de permisos
        @param id_origen: identificador del item origen
        @param id_destino: identificador del item destino
        @param tipo: tipo de relacion(padre, hijo, antecesor, sucesor)
        @param activo: estado de la relacion activo e inactivo
        @param nombre_origen:   nombre del item origen
        @param nombre_destino: nombre del item destino  
        '''
        self.id_relacion = id_relacion
        self.id_origen = id_origen
        self.id_destino = id_destino
        self.tipo = tipo
        self.activo = activo
        self.nombre_origen= nombre_origen
        self.nombre_destino = nombre_destino
        
        
    def __repr__(self):
        return '{id_relacion:%s, id_origen:%s, id_destino:%s}' % (self.id_relacion, self.id_origen, self.id_destino)
    
    
    def __json__(self):
        '''
        devuelve el json que representa a permisos
        '''
        return {'id':self.id_relacion,
                'id_origen':self.id_origen,
                'id_relacion': self.id_relacion,
                'id_destino': self.id_destino,
                'tipo': self.tipo,
                'activo': self.activo,
                'nombre_origen': self.nombre_origen,
                'nombre_destino': self.nombre_destino 
                          
                }
        
def revertir(id_item, version):
    """
        metodo que hace la reversion de un item
        @param id_item: el item que va a revertirse
        @param version: la version a la cual se desea pasar
    """
    #primero obtenemos la version a la que queremos pasar
    historialItem = HistorialItem.query.filter(HistorialItem.id_item == id_item).filter(HistorialItem.version == version).one()
    #obtenemos las relaciones en las que es origen esa version del item
    historialRelacion = HistorialRelacion.query.filter(HistorialRelacion.id_destino == historialItem.id_historial_item).all()
    for hr in historialRelacion:
        #obtenemos la relacion a la que apunta ese historial
        relacion = Relaciones.query.filter(Relaciones.id_relacion == hr.id_relacion).first()
        #si el estado actual de esa relacion que la del historial, entonces no hay que eliminar o revivir ninguna relacion
        if relacion.activo ==hr.activo:
            item = Item.query.filter(Items.id_item == id_item).update({'estado': historialItem.estado, 'id_tipo_item': historialItem.id_tipo_item, 'version': item.version + 1, 'complejidad': historialItem.complejidad,'descripcion': historialItem.descripcion, 'observacion': historialItem.observacion, 'prioridad': historialItem.prioridad})
            db.session.commit()
            